home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / ms_dos / the / the.asm next >
Encoding:
Assembly Source File  |  1993-07-08  |  28.8 KB  |  1,769 lines

  1. ;
  2. ;    “THe”リアルエディタ
  3. ;
  4. ;        テストバージョン    92/04/25 14:15:32 
  5. ;        最低機能バージョン    92/07/23 17:13:17 ~
  6. ;        超暫定バージョン   ~ 92/09/20 22:06:50 
  7. ;        暫定バージョン        92/09/24 16:20:20 ~ 92/09/24 17:58:57 
  8. ;
  9.  
  10. IDEAL
  11. DOSSEG
  12. P8086
  13. JUMPS
  14.  
  15. CR    EQU    0DH,0AH
  16. NULL    EQU    00H
  17. FULL    EQU    48*1024        ;最大編集サイズ
  18.  
  19.  
  20. SEGMENT        CODE        "CODE"
  21.  
  22.     ASSUME    CS:CODE,DS:CODE,ES:CODE,SS:CODE
  23.  
  24.     ORG    100H                ;“THe.COM”
  25.  
  26. ;---------------------------------------
  27. ;        スタートアップ処理
  28. ;---------------------------------------
  29.  
  30. ENTRY:
  31.     CLD
  32.     MOV    AX,CS
  33.     MOV    DS,AX            ;DSをCSに合わせる
  34.     MOV    ES,AX
  35.  
  36. GETCMD:
  37.     MOV    SI,81H            ;移し元ポインタ(双方とも、)
  38.     XOR    BP,BP            ;ポインタのポインタ
  39.     JMP    GETCMD4
  40.  
  41. GETCMDP:
  42.     MOV    [WORD CMDPOINTER+BP],SI
  43.     INC    BP
  44.     INC    BP            ;ポインタ設定
  45. GETCMD2:
  46.     CMP    [BYTE SI],0DH
  47.     JE    GETCMD5            ;最後の処理へ
  48.  
  49.     CMP    [BYTE SI],20H
  50.     JE    GETCMD3            ;飛ばし処理へ
  51.  
  52.     INC    SI
  53.  
  54.     JMP    GETCMD2
  55.  
  56. GETCMD3:
  57.     MOV    [BYTE SI],00H
  58.     INC    SI            ;まずヌル入れ
  59. GETCMD4:
  60.     CMP    [BYTE SI],0DH
  61.     JE    GETCMD5            ;最後の処理へ
  62.     CMP    [BYTE SI],20H
  63.     JNE    GETCMDP            ;スペースじゃなかったら帰る
  64.  
  65.     INC    SI
  66.     JMP    GETCMD4            ;スペースだったら移動してまた調べる
  67.  
  68. GETCMD5:
  69.     MOV    [BYTE SI],00H        ;埋め込んで終わり
  70.     MOV    [WORD CMDCOUNTER],BP
  71.  
  72.  
  73.  
  74.     XOR    BX,BX
  75.     MOV    DX,0FFFFH
  76. READCMD:
  77.     CMP    BP,BX
  78.     JE    READEND
  79.  
  80.     MOV    DI,[WORD CMDPOINTER+BX]
  81.     CMP    [BYTE DI],"-"
  82.     JE    OP_READ
  83.     CMP    [BYTE DI],"/"
  84.     JE    OP_READ
  85.  
  86.     MOV    DX,DI
  87.  
  88. COMEREAD:
  89.     INC    BX
  90.     INC    BX
  91.     JMP    READCMD
  92.  
  93. OP_READ:
  94.     JMP    COMEREAD        ;現行、オプション無し
  95.  
  96. READEND:
  97.     CMP    DX,0FFFFH
  98.     JNE    READEND2        ;ファイル名指定なら、ロードへ
  99.  
  100.     MOV    [BYTE FNAME],NULL
  101.     JMP    MAIN
  102. READEND2:
  103.     MOV    SI,DX
  104.     MOV    DI,OFFSET FNAME
  105.     CALL    STRCPY
  106.  
  107.     CALL    LOAD
  108.  
  109. ;---------------------------------------
  110. ;        初期設定と画面を描く
  111. ;---------------------------------------
  112.  
  113. MAIN:
  114.     MOV    AX,0501H
  115.     INT    90H            ;クリック音無し
  116.  
  117.     MOV    AH,00H
  118.     INT    91H            ;コンソールBIOS初期化(消去)
  119.  
  120.     MOV    AH,09H
  121.     MOV    AL,11110000B
  122.     INT    91H            ;カーソル形状設定(ボックス)
  123.  
  124.     MOV    AH,1BH
  125.     MOV    AL,01000010B
  126.     INT    91H            ;表示属性の決定
  127.  
  128.     MOV    AX,CS
  129.     MOV    [WORD SYSLINE+02H],AX
  130.     MOV    [WORD SYSLINE+06H],AX
  131.     MOV    AX,1F01H
  132.     MOV    CX,70
  133.     MOV    DL,01H
  134.     MOV    DI,OFFSET SYSLINE
  135.     INT    91H            ;システム行書き込み。
  136.  
  137.     MOV    AH,11H
  138.     MOV    DI,OFFSET SYSATTLIB+4
  139.     INT    91H            ;リバース
  140.  
  141.     MOV    AH,1EH
  142.     MOV    CX,160
  143.     MOV    DI,OFFSET UPPART
  144.     INT    91H            ;上の文字を書く
  145.  
  146.     MOV    AH,11H
  147.     MOV    DI,OFFSET SYSATTLIB+0
  148.     INT    91H            ;リバース解除
  149.  
  150.     MOV    BX,OFFSET EBUF
  151.     MOV    [WORD CURP],BX
  152.     MOV    [WORD NOWL],BX        ;ポインタセット
  153.  
  154.     CMP    [BYTE FNAME],NULL
  155.     JE    READ            ;ファイル名、無指定なら、読み込みへ
  156.  
  157.     CALL    NOWLINE
  158.     CALL    SCREEN            ;画面表示
  159.     MOV    CX,01
  160.     CALL    NS_PUT            ;現在の状態を書く
  161.     CALL    W_FNAME            ;ファイル名を書く
  162.  
  163. ;---------------------------------------
  164. ;        キー読み取り(事実上メイン)
  165. ;---------------------------------------
  166.  
  167. OAKLOOP1:
  168.     MOV    [WORD CHAN],0
  169.     CALL    PUTCUR
  170.  
  171.     MOV    AX,0900H
  172.     INT    90H        ;一文字の入力。フリーウェアで(DOSで)、
  173.                 ;漢字の処理も、ここでやってくれる。
  174.     CMP    DL,20H
  175.     JB    OAKLOOP1B    ;普通のキー入力ならそこへ
  176.  
  177. NOR_KEY:
  178. ;----------------
  179. ;    普通のキー入力
  180. ;----------------
  181.     CMP    [WORD LEN],FULL
  182.     JA    OAKLOOP1        ;サイズオーバーなら無効
  183.  
  184.     INC    [WORD CHAN]        ;一括の為のカウンター
  185.  
  186.     MOV    SI,OFFSET EBUF
  187.     ADD    SI,[WORD LEN]
  188.  
  189.     MOV    DI,SI
  190.  
  191.     MOV    CX,SI
  192.     SUB    CX,[WORD CURP]        ;差を出す
  193.  
  194.     DEC    SI
  195.     STD
  196.     REP    MOVSB
  197.     CLD
  198.  
  199.     MOV    BX,[WORD CURP]
  200.     MOV    [BYTE BX],DL
  201.     INC    [WORD LEN]
  202.     INC    [WORD CURP]
  203.     MOV    [BYTE PF],1
  204.  
  205.     MOV    AH,07H
  206.     INT    90H
  207.  
  208.     CMP    DH,0FFH
  209.     JNE    NOR_KEY2        ;入力文字無しは?
  210.  
  211. NOR_KEY1A:
  212.     CALL    NOWLINE
  213.  
  214.     MOV    AX,[WORD CHAN]
  215.     SUB    [WORD CURP],AX
  216. NOR_LOOP:
  217.     DEC    [WORD CHAN]
  218.     CALL    CHARIGHT
  219.     CMP    [WORD CHAN],0
  220.     JNE    NOR_LOOP
  221.  
  222.     MOV    CX,[WORD CURL]
  223.     CALL    NS_PUT
  224.     CALL    SCREEN
  225.  
  226.     JMP    OAKLOOP1
  227.  
  228. NOR_KEY2:
  229.     CMP    DL,20H
  230.     JB    NOR_KEY1A
  231.  
  232.     MOV    AX,0900H
  233.     INT    90H
  234.  
  235.     JMP    NOR_KEY
  236.  
  237.  
  238.  
  239. OAKLOOP1B:
  240.     CMP    DL,9
  241.     JE    NOR_KEY        ;タブ入力
  242.  
  243.     CMP    DL,1EH
  244.     JNE    OAKLOOP2
  245.  
  246. ;----------------
  247. ;    上移動
  248. ;----------------
  249.  
  250.     MOV    AX,0600H
  251.     INT    90H        ;バッファのクリア
  252.     MOV    DI,01
  253.  
  254.     AND    BL,00000100B
  255.     CMP    BL,00000100B
  256.     JNE    NORMALUP
  257.  
  258.     MOV    DI,10
  259. NORMALUP:
  260.     CALL    CURUP
  261.     CALL    NS_PUT            ;現在の状態を書く
  262.     CALL    SCREEN            ;画面表示
  263.     JMP    OAKLOOP1
  264.  
  265. OAKLOOP2:
  266.     CMP    DL,1FH
  267.     JNE    OAKLOOP3
  268.  
  269. ;----------------
  270. ;    下移動
  271. ;----------------
  272.  
  273.     MOV    AX,0600H
  274.     INT    90H        ;バッファのクリア
  275.     MOV    DI,01
  276.  
  277.     AND    BL,00000100B
  278.     CMP    BL,00000100B
  279.     JNE    NORMALDOWN
  280.  
  281.     MOV    DI,10
  282. NORMALDOWN:
  283.     CALL    CURDOWN
  284.     CALL    NS_PUT            ;現在の状態を書く
  285.     CALL    SCREEN            ;画面表示
  286.     JMP    OAKLOOP1
  287.  
  288. OAKLOOP3:
  289.     CMP    DL,1CH
  290.     JNE    OAKLOOP4
  291.  
  292. ;----------------
  293. ;    右移動
  294. ;----------------
  295.  
  296.     MOV    AX,0600H
  297.     INT    90H        ;バッファのクリア
  298.     AND    BL,00000100B
  299.     CMP    BL,00000100B
  300.     JNE    NORMALRIGHT
  301.  
  302. ;    SHIFT+『→』のルーチン
  303.  
  304. NORMALRIGHT:
  305.     CALL    CURRIGHT
  306.     CALL    NS_PUT            ;現在の状態を書く
  307.     CALL    SCREEN            ;画面表示
  308.     JMP    OAKLOOP1
  309.  
  310. OAKLOOP4:
  311.     CMP    DL,1DH
  312.     JNE    OAKLOOP5
  313.  
  314. ;----------------
  315. ;    左移動
  316. ;----------------
  317.  
  318.     MOV    AX,0600H
  319.     INT    90H        ;バッファのクリア
  320.     AND    BL,00000100B
  321.     CMP    BL,00000100B
  322.     JNE    NORMALLEFT
  323.  
  324. ;    SHIFT+『→』のルーチン
  325.  
  326. NORMALLEFT:
  327.     CALL    CURLEFT
  328.     CALL    NS_PUT            ;現在の状態を書く
  329.     CALL    SCREEN            ;画面表示
  330.     JMP    OAKLOOP1
  331.  
  332. OAKLOOP5:
  333.     CMP    DL,0DH
  334.     JNE    OAKLOOP6
  335.  
  336. ;----------------
  337. ;    リターン
  338. ;----------------
  339.  
  340.     MOV    AX,0600H
  341.     INT    90H        ;バッファのクリア
  342.     MOV    SI,OFFSET EBUF
  343.     ADD    SI,[WORD LEN]
  344.  
  345.     MOV    DI,SI
  346.  
  347.     MOV    CX,SI
  348.     SUB    CX,[WORD CURP]        ;差を出す
  349.  
  350.     DEC    SI
  351.     DEC    SI
  352.     STD
  353.     REP    MOVSB
  354.     CLD
  355.  
  356.     MOV    BX,[WORD CURP]
  357.     MOV    [BYTE BX]  ,0DH
  358.     MOV    [BYTE BX+1],0AH
  359.     INC    [WORD LEN]
  360.     INC    [WORD LEN]
  361.     MOV    [BYTE PF],1
  362.  
  363.     CALL    NOWLINE
  364.     CALL    CHARIGHT
  365.  
  366.     MOV    [BYTE PF],1
  367.     CALL    NS_PUT
  368.     CALL    SCREEN
  369.     JMP    OAKLOOP1
  370.  
  371. OAKLOOP6:
  372.     CMP    DL,08H
  373.     JNE    OAKLOOP7
  374.  
  375. ;----------------
  376. ;    バックスペース
  377. ;----------------
  378.  
  379.     AND    BL,00000100B
  380.     CMP    BL,00000100B
  381.     JNE    NORMALBS
  382.  
  383. NORMALBS:
  384.     CALL    CURLEFT
  385.     MOV    [BYTE PF],0    ;変更なし、として、下のルーチンの時間をかせぐ
  386.     CALL    SCREEN        ;その場所が全角か半角かを求めるのに使っている
  387.  
  388.     JMP    DEKEY        ;実は、バックスペースは、左+削除だ!
  389.  
  390. OAKLOOP7:
  391.  
  392. OAKPFKEY1:
  393.     MOV    AX,0600H
  394.     INT    90H        ;バッファのクリア
  395. ;----------------
  396. ;    終了
  397. ;----------------
  398.  
  399.     CMP    BH,66H            ;PF10(終了)
  400.     JE    FIN
  401.  
  402. ;----------------
  403. ;    読み込み
  404. ;----------------
  405.  
  406.     CMP    BH,5EH            ;PF 2(読込)
  407.     JNE    WRITE
  408. READ:
  409.     CALL    INPUT_NAME
  410.     CALL    W_FNAME            ;ファイル名を書く
  411.  
  412.     JMP    FOR_RENAME
  413.  
  414. ;----------------
  415. ;    更新
  416. ;----------------
  417. WRITE:
  418.     CMP    BH,61H            ;PF 5(更新)
  419.     JNE    SAVEND
  420.  
  421.     CALL    UPDATE
  422.     JMP    OAKLOOP1
  423.  
  424. ;----------------
  425. ;    保存
  426. ;----------------
  427. SAVEND:
  428.     CMP    BH,5DH            ;PF 1(保存)
  429.     JNE    RENAME
  430.  
  431.     CALL    UPDATE            ;保存へ
  432.     CMP    AX,0
  433.     JE    FIN            ;エラーだったら終了せず
  434.  
  435.     JMP    OAKLOOP1
  436.  
  437. ;----------------
  438. ;    改名
  439. ;----------------
  440. RENAME:
  441.     CMP    BH,5FH            ;PF 3(改名)
  442.     JNE    REEDIT
  443.  
  444.     CALL    INPUT_NAME
  445.     CALL    W_FNAME            ;ファイル名を書く
  446.     MOV    [BYTE PF],1
  447.     CALL    SCREEN            ;画面表示
  448.  
  449.     JMP    OAKLOOP1
  450.  
  451. ;----------------
  452. ;    再編集
  453. ;----------------
  454. REEDIT:
  455.     CMP    BH,60H            ;PF 4(再編集)
  456.     JNE    DELE
  457.  
  458. FOR_RENAME:
  459.     MOV    DX,OFFSET FNAME
  460.     CALL    LOAD
  461.  
  462.     CALL    NOWLINE
  463.     CALL    NS_PUT            ;現在の状態を書く
  464.     CALL    SCREEN            ;画面表示
  465.     JMP    OAKLOOP1
  466.  
  467. ;----------------
  468. ;    削除
  469. ;----------------
  470. DELE:
  471.     CMP    BH,4BH
  472.     JNE    OAKPFKEY2        ;削除
  473. DEKEY:
  474.     MOV    DI,[WORD CURP]
  475.     MOV    AL,[BYTE DI]
  476.     MOV    AH,[BYTE DI+1]        ;リターンコード処理
  477.     MOV    BP,OFFSET EBUF
  478.     ADD    BP,[WORD LEN]        ;しょっちゅう出てくるから、作ろうか?
  479.     CMP    DI,BP
  480.     JE    OAKLOOP1
  481.  
  482.     MOV    SI,DI
  483.     INC    SI
  484.  
  485.     CMP    AL,0DH
  486.     JNE    DEKEY2
  487.     CMP    AH,0AH
  488.     JNE    DEKEY2
  489.  
  490.     INC    SI            ;リターンコード一括削除
  491.     DEC    [WORD LEN]        ;更新
  492. DEKEY2:
  493.     MOV    AX,[WORD ZHF]
  494.     ADD    SI,AX            ;全角か?
  495.     SUB    [WORD LEN],AX
  496.  
  497.     MOV    CX,BP
  498.     SUB    CX,SI            ;差を出す
  499.  
  500.     REP    MOVSB            ;CLD前提
  501.  
  502.     DEC    [WORD LEN]        ;更新
  503. DEKEY3:
  504.     CALL    NOWLINE
  505.  
  506.     MOV    [BYTE PF],1
  507.     CALL    NS_PUT
  508.     CALL    SCREEN
  509.     JMP    OAKLOOP1
  510.  
  511. OAKPFKEY2:
  512.     JMP    OAKLOOP1        ;判読不能
  513.  
  514.  
  515. ;--------------------------------------
  516. ;    壮大な終了!!
  517. ;
  518. ;    また起動するのだ。
  519. ;--------------------------------------
  520. FIN:
  521.     MOV    AX,0600H
  522.     INT    90H        ;バッファのクリア
  523.     XOR    AH,AH
  524.     INT    91H        ;コンソールBIOS初期化
  525.  
  526.     MOV    AH,4CH
  527.     INT    21H
  528.  
  529.  
  530. ;--------------------------------------
  531. ;    更新ルーチン
  532. ;
  533. ;
  534. ;--------------------------------------
  535. PROC    UPDATE
  536.  
  537.     MOV    AH,3CH
  538.     MOV    DX,OFFSET FNAME
  539.     MOV    CX,0000000000000000B
  540.     INT    21H
  541.  
  542.     JC    UPD_ERR_RET
  543.  
  544.     MOV    BX,AX
  545.  
  546.     MOV    AH,40H
  547.     MOV    DX,OFFSET EBUF
  548.     MOV    CX,[WORD LEN]
  549.     INT    21H
  550.  
  551.     JC    UPD_ERR_RET
  552.  
  553.     MOV    AX,0
  554.     RET
  555.  
  556. UPD_ERR_RET:
  557.     MOV    AX,1            ;エラー処理
  558.     RET
  559.  
  560. ENDP
  561.  
  562. ;--------------------------------------
  563. ;    名前入力ルーチン
  564. ;
  565. ;
  566. ;--------------------------------------
  567. PROC    INPUT_NAME
  568.  
  569.     MOV    AH,11H
  570.     MOV    DI,OFFSET SYSATTLIB+4
  571.     INT    91H            ;リバース
  572.  
  573.     MOV    AH,0DH
  574.     MOV    DH,12
  575.     MOV    DL,01
  576.     INT    91H            ;カーソル移動
  577.  
  578.     MOV    AH,1EH
  579.     MOV    CX,80
  580.     MOV    DI,OFFSET SPA80
  581.     INT    91H
  582.  
  583.     MOV    AH,0DH
  584.     MOV    DH,14
  585.     MOV    DL,01
  586.     INT    91H            ;カーソル移動
  587.  
  588.     MOV    AH,1EH
  589.     MOV    CX,80
  590.     MOV    DI,OFFSET SPA80
  591.     INT    91H
  592.  
  593.     MOV    AH,11H
  594.     MOV    DI,OFFSET SYSATTLIB+0
  595.     INT    91H            ;リバース解除
  596.  
  597.     MOV    AH,0DH
  598.     MOV    DH,13
  599.     MOV    DL,01
  600.     INT    91H            ;カーソル移動
  601.  
  602.     MOV    AH,1EH
  603.     MOV    CX,80
  604.     MOV    DI,OFFSET SPA80
  605.     INT    91H
  606.  
  607.     MOV    AH,0DH
  608.     MOV    DH,13
  609.     MOV    DL,02
  610.     INT    91H            ;カーソル移動
  611.  
  612.     MOV    AH,1BH
  613.     MOV    AL,11000010B
  614.     INT    91H            ;表示属性の決定
  615.  
  616.     MOV    AH,0AH
  617.     MOV    DX,OFFSET TMP_NAME
  618.     INT    21H
  619.  
  620.     MOV    AH,1BH
  621.     MOV    AL,01000010B
  622.     INT    91H            ;表示属性の決定
  623.  
  624.     MOV    SI,OFFSET TMP_NAME+2
  625.     MOV    DI,OFFSET FNAME
  626. @@_1:
  627.     LODSB
  628.     STOSB                ;CLD前提
  629.     CMP    AL,0DH
  630.     JNE    @@_1
  631.  
  632.     MOV    [BYTE DI-1],NULL
  633.  
  634.     RET
  635.  
  636. ENDP
  637.  
  638. ;---------------------------------------
  639. ;        ファイルをロード
  640. ;IN    DX
  641. ;OUT    AX(00H=正常終了,01H=失敗)
  642. ;BREAK    AX,BX,CX,SI
  643. ;---------------------------------------
  644.  
  645. PROC    LOAD
  646.  
  647.     MOV    AX,03D00H
  648.     INT    21H        ;オープン
  649.     JC    ERET        ;エラーリターン
  650.     MOV    BX,AX        ;ファイルハンドルをBXに移す
  651.  
  652.     MOV    AX,4202H
  653.     XOR    CX,CX
  654.     XOR    DX,DX
  655.     INT    21H        ;ファイルの最後を求める
  656.  
  657.     CMP    DX,00H
  658.     JNE    ERET        ;サイズが16ビットを越えていたらエラー
  659.     CMP    AX,FULL
  660.     JA    ERET        ;サイズがFULLバイトを越えていたらエラー
  661.     MOV    [WORD LEN],AX
  662.  
  663.     MOV    AX,4200H
  664.     XOR    CX,CX
  665.     XOR    DX,DX
  666.     INT    21H        ;ファイルの最初に戻す
  667.  
  668. HNEXT:
  669.     MOV    CX,[WORD LEN]    ;一度に読む
  670.     XOR    SI,SI        ;ポインタ初期化
  671.     MOV    DX,OFFSET EBUF    ;先頭に
  672. HREAD:
  673.     MOV    AH,03FH
  674.     INT    21H
  675.     JC    ERET        ;簡易エラー表示
  676.  
  677. CLOSE:
  678.     MOV    AH,3EH
  679.     INT    21H        ;クローズ
  680.     JC    ERET        ;クローズ出来ない
  681.  
  682.     MOV    BX,OFFSET EBUF
  683.     MOV    [WORD CURP],BX
  684.     MOV    [WORD NOWL],BX    ;ポインタセット
  685.     MOV    [BYTE PF],1    ;改変されたというフラグ
  686.  
  687.     MOV    AX,00H        ;ロード完了
  688.     RET
  689.  
  690. ERET:
  691.     MOV    BX,OFFSET EBUF
  692.     MOV    [WORD CURP],BX
  693.     MOV    [WORD NOWL],BX    ;ポインタセット
  694.     MOV    [BYTE PF],1    ;改変されたというフラグ
  695.     MOV    [WORD LEN],0
  696.  
  697.     MOV    AX,01H
  698.     RET
  699.  
  700. ENDP    LOAD
  701.  
  702. ;---------------------------------------
  703. ;        スクリーン表示
  704. ;IN    NOWL
  705. ;OUT    表示
  706. ;BREAK    AX,CX,DX,BP,SI,DI,SCRBUF
  707. ;---------------------------------------
  708.  
  709. PROC    SCREEN
  710.  
  711.     PUSH    BX            ;全角フラグ
  712.     XOR    BL,BL            ;0は半角(半額では無い)
  713.  
  714.     MOV    SI,[WORD NOWL]        ;先頭行ポインタ
  715.     MOV    DI,OFFSET SCRBUF    ;表示バッファ
  716.     XOR    DX,DX            ;行、桁ポインタ
  717.     MOV    BP,[WORD LEN]        ;編集テキスト長
  718.     ADD    BP,OFFSET EBUF        ;EOFポイント
  719. SCRLOOP1:
  720.     MOV    AL,[BYTE SI]
  721.     MOV    [BYTE DI],AL
  722.  
  723.     CMP    BL,1
  724.     JE    HAN        ;前の文字が全角先頭なら次は全角後尾
  725.     CMP    AL,0DFH
  726.     JA    ZEN
  727.     CMP    AL,80H
  728.     JB    EOZ
  729.     CMP    AL,09FH
  730.     JA    EOZ        ;前が半角なら、次が全角先頭か判断
  731. ZEN:
  732.     MOV    BL,1
  733.     JMP    EOZ        ;全角先頭と判断
  734. HAN:
  735.     XOR    BL,BL        ;全角先頭のフラグを下げる
  736. EOZ:
  737.     CMP    [WORD CURP],SI
  738.     JNE    SCRLOOP1B
  739.  
  740.     PUSH    DX
  741.     INC    DL
  742.     INC    DH
  743.     INC    DH
  744.     INC    DH
  745.     MOV    [BYTE CURX],DL
  746.     MOV    [BYTE CURY],DH
  747.     POP    DX
  748.  
  749.     CMP    BL,0
  750.     JE    CZ2
  751. CZ1:
  752.     MOV    AH,09H
  753.     MOV    AL,11110000B
  754.     INT    91H            ;カーソル形状設定(全角)
  755.     MOV    [WORD ZHF],1        ;保存フラグ
  756.     JMP    SCRLOOP1B
  757. CZ2:
  758.     MOV    AH,09H
  759.     MOV    AL,01110000B
  760.     INT    91H            ;カーソル形状設定(半角)
  761.     MOV    [WORD ZHF],0        ;保存フラグ
  762.  
  763.     ;注:コンソールエミューターではカーソルの形が変えられなかった。
  764.     ;注:本物のコンソールでも変えられなかった…。
  765.  
  766. SCRLOOP1B:
  767.     CMP    BP,SI
  768.     JE    SCRPUT            ;EOFで表示へ
  769.  
  770.     CMP    DH,21
  771.     JE    SCRPUT            ;行限界で表示へ
  772.  
  773.     CMP    [BYTE SI],0DH
  774.     JNE    SCRLOOP3
  775.     DEC    BP
  776.     CMP    BP,SI
  777.     INC    BP
  778.     JE    SCRLOOP3
  779.     CMP    [BYTE SI+1],0AH
  780.     JNE    SCRLOOP3
  781.  
  782.     INC    SI
  783.     INC    SI            ;ポインタの移動
  784.     MOV    AL,20H            ;半角スペース
  785. SCRLOOP2:
  786.     CMP    DL,80
  787.     JE    SCRLOOP2E
  788.  
  789.     STOSB
  790.     INC    DL
  791.  
  792.     JMP    SCRLOOP2
  793.  
  794. SCRLOOP2E:
  795.     XOR    DL,DL
  796.     INC    DH
  797.     XOR    BL,BL
  798.  
  799.     JMP    SCRLOOP1
  800.  
  801. SCRLOOP3:
  802.     CMP    [BYTE SI],09H
  803.     JNE    SCRLOOP4
  804.     XOR    BL,BL
  805.  
  806.     INC    SI
  807.     MOV    AL,DL
  808.     SHR    AL,1
  809.     SHR    AL,1
  810.     SHR    AL,1
  811.     INC    AL
  812.     SHL    AL,1
  813.     SHL    AL,1
  814.     SHL    AL,1
  815.  
  816.     CMP    AL,80
  817.     JB    SCRLOOP3B
  818.  
  819.     MOV    AL,80
  820.  
  821. SCRLOOP3B:
  822.     MOV    [BYTE DI],20H
  823.     INC    DI
  824.     INC    DL    
  825.  
  826.     CMP    AL,DL
  827.     JNE    SCRLOOP3B
  828.  
  829.     JMP    SCRLOOP4B        ;BUG FIXED    92/07/30 22:05:49 
  830.  
  831. SCRLOOP4:
  832.     INC    SI
  833.     INC    DI
  834.     INC    DL
  835. SCRLOOP4B:
  836.     CMP    DL,80
  837.     JNE    SCRLOOP1    ;80文字目か判断
  838.  
  839.     CMP    BL,1
  840.     JNE    EOZ2        ;全角先頭か判断
  841.  
  842.     DEC    SI
  843.     DEC    DI        ;戻して
  844.     MOV    [BYTE DI],1CH    ;『→』に書換えて
  845.     XOR    DL,DL        ;桁ポインタ操作
  846.     INC    DH        ;行を増やす
  847.     INC    DI
  848.  
  849.     MOV    AL,[BYTE SI]
  850.     MOV    [BYTE DI],AL
  851.     JMP    EOZ
  852.  
  853. EOZ2:
  854.     XOR    DL,DL
  855.     INC    DH
  856.  
  857.     JMP    SCRLOOP1
  858.  
  859. SCRPUT:
  860.     CMP    DI,OFFSET SCRBUF+80*21
  861.     JE    SCRPUT2
  862.  
  863.     MOV    [BYTE DI],20H
  864.     INC    DI
  865.     JMP    SHORT    SCRPUT
  866.  
  867. SCRPUT2:
  868.     MOV    AH,0DH
  869.     MOV    DX,0301H
  870.     INT    91H
  871.  
  872.     CMP    [BYTE PF],0
  873.     JE    SCRRET
  874.  
  875.     MOV    AH,1EH
  876.     MOV    DI,OFFSET SCRBUF
  877.     MOV    CX,80*21
  878.     INT    91H
  879.  
  880.     MOV    [BYTE PF],0
  881.  
  882. SCRRET:
  883.     POP    BX
  884.     RET
  885.  
  886. ENDP
  887.  
  888.  
  889. ;---------------------------------------
  890. ;        カーソルを描く
  891. ;IN    CURX,CURY
  892. ;OUT    表示
  893. ;BREAK    AX,DX
  894. ;---------------------------------------
  895.  
  896. PROC    PUTCUR
  897.  
  898.     MOV    DL,[BYTE CURX]
  899.     MOV    DH,[BYTE CURY]
  900.     MOV    AH,0DH
  901.     INT    91H
  902.  
  903.     RET
  904.  
  905. ENDP
  906.  
  907. ;---------------------------------------
  908. ;        文字を打った後のカーソルを右に移動
  909. ;IN    CURX,CURY
  910. ;OUT    CURX,CURY,表示,CURP,SI
  911. ;BREAK    BX,CX,DX
  912. ;---------------------------------------
  913.  
  914. PROC    CHARIGHT
  915.  
  916.     MOV    CX,[WORD CURL]
  917.     MOV    SI,[WORD CURP]
  918.  
  919.     MOV    DL,[BYTE CURX]
  920.     MOV    DH,[BYTE CURY]
  921.     MOV    BP,[WORD LEN]        ;編集テキスト長
  922.     ADD    BP,OFFSET EBUF        ;EOFポイント
  923. CHALOOP1:
  924.     CMP    [BYTE SI],0DH
  925.     JNE    CHALOOP1B
  926.     DEC    BP
  927.     CMP    SI,BP
  928.     INC    BP
  929.     JE    CHALOOP1B
  930.     CMP    [BYTE SI+1],0AH
  931.     JNE    CHALOOP1B
  932.  
  933.     INC    SI
  934. CHALOOP1B:
  935.     INC    SI
  936.  
  937.     MOV    BP,CX
  938.     SHL    BP,1
  939.     MOV    BX,[WORD ELINE+BP]    ;次の行の先頭ポインタを求める
  940.     CMP    SI,BX            ;同じなら、次の行に行っている
  941.     JNE    CHARET
  942.  
  943.     CMP    DH,22
  944.     JNE    CHALOOP2
  945.  
  946.     CALL    DOWN
  947.     INC    [BYTE PF]    ;動いた
  948.     INC    CX
  949.  
  950.     JMP    CHARET
  951.  
  952. CHALOOP2:
  953.     INC    DH        ;カーソル下
  954.     INC    CX
  955. CHARET:
  956.     MOV    [WORD CURP],SI
  957.     MOV    [WORD CURL],CX
  958.  
  959.     RET
  960.  
  961. ENDP
  962.  
  963. ;---------------------------------------
  964. ;        カーソルを右に移動
  965. ;IN    CURX,CURY
  966. ;OUT    CURX,CURY,表示,CURP,SI
  967. ;BREAK    BX,CX,DX
  968. ;---------------------------------------
  969.  
  970. PROC    CURRIGHT
  971.  
  972.     MOV    CX,[WORD CURL]
  973.     MOV    SI,[WORD CURP]
  974.  
  975.     MOV    DL,[BYTE CURX]
  976.     MOV    DH,[BYTE CURY]
  977.     MOV    BP,[WORD LEN]        ;編集テキスト長
  978.     ADD    BP,OFFSET EBUF        ;EOFポイント
  979. CRILOOP1:
  980.     CMP    SI,BP
  981.     JE    CRIRET
  982.  
  983.     CMP    [WORD ZHF],1
  984.     JE    MMRIGHT
  985.  
  986.     CMP    [BYTE SI],0DH
  987.     JNE    CRILOOP1B
  988.     DEC    BP
  989.     CMP    SI,BP
  990.     INC    BP
  991.     JE    CRILOOP1B
  992.     CMP    [BYTE SI+1],0AH
  993.     JNE    CRILOOP1B
  994. MMRIGHT:
  995.     INC    SI
  996. CRILOOP1B:
  997.     INC    SI
  998.  
  999.     MOV    BP,CX
  1000.     SHL    BP,1
  1001.     MOV    BX,[WORD ELINE+BP]    ;次の行の先頭ポインタを求める
  1002.     CMP    SI,BX            ;同じなら、次の行に行っている
  1003.     JNE    CRIRET
  1004.  
  1005.     CMP    DH,22
  1006.     JNE    CRILOOP2
  1007.  
  1008.     CALL    DOWN
  1009.     INC    [BYTE PF]    ;動いた
  1010.     INC    CX
  1011.  
  1012.     JMP    CRIRET
  1013.  
  1014. CRILOOP2:
  1015.     INC    DH        ;カーソル下
  1016.     INC    CX
  1017. CRIRET:
  1018.     MOV    [WORD CURP],SI
  1019.     MOV    [WORD CURL],CX
  1020.  
  1021.     RET
  1022.  
  1023. ENDP
  1024.  
  1025. ;---------------------------------------
  1026. ;        カーソルを左に移動
  1027. ;IN    CURX,CURY
  1028. ;OUT    CURX,CURY,表示,CURP,SI
  1029. ;BREAK    BX,CX,DX
  1030. ;---------------------------------------
  1031.  
  1032. PROC    CURLEFT
  1033.  
  1034.     MOV    CX,[WORD CURL]
  1035.     MOV    SI,[WORD CURP]
  1036.  
  1037.     MOV    DL,[BYTE CURX]
  1038.     MOV    DH,[BYTE CURY]
  1039. CLELOOP1:
  1040.     CMP    SI,OFFSET EBUF
  1041.     JE    CLERET            ;左不可
  1042.  
  1043.     MOV    BP,CX
  1044.     DEC    BP
  1045.     SHL    BP,1            ;行からポインタになおす
  1046.  
  1047.     CMP    SI,[WORD ELINE+BP]
  1048.     JNE    CLELOOP2
  1049.  
  1050.     MOV    DL,79            ;理想桁指定
  1051.     MOV    DI,1
  1052.     MOV    SI,OFFSET EBUF
  1053.     MOV    [BYTE PF],0
  1054.     JMP    CUPLOOP1
  1055.  
  1056. CLELOOP2:
  1057.     DEC    DL
  1058.     JMP    CUPRET            ;超無謀!
  1059.  
  1060. CLERET:
  1061.     RET                ;おまけ
  1062.  
  1063. ENDP
  1064.  
  1065. ;---------------------------------------
  1066. ;        カーソルを上に移動
  1067. ;IN    CURX,CURY,DI
  1068. ;OUT    CURX,CURY,表示,CURP,SI
  1069. ;BREAK    BX,CX,DX
  1070. ;---------------------------------------
  1071.  
  1072. PROC    CURUP
  1073.  
  1074.     MOV    CX,[WORD CURL]
  1075.     MOV    [BYTE PF],0
  1076.  
  1077.     MOV    DL,[BYTE CURX]
  1078.     MOV    DH,[BYTE CURY]
  1079.     MOV    SI,OFFSET EBUF
  1080. CUPLOOP1:
  1081.     CMP    CX,01
  1082.     JE    CUPRET        ;移動不能
  1083.  
  1084.     CMP    DH,04
  1085.     JNE    CUPLOOP2
  1086.  
  1087.     CMP    CX,02
  1088.     JE    CUPLOOP2    ;移動不能
  1089.  
  1090.     CALL    UP
  1091.     INC    [BYTE PF]    ;動いた
  1092.     DEC    CX
  1093.  
  1094.     DEC    DI
  1095.     CMP    DI,00
  1096.     JNE    CUPLOOP1
  1097.  
  1098.     JMP    CUPRET
  1099.  
  1100. CUPLOOP2:
  1101.     DEC    DH        ;カーソル上
  1102.     DEC    CX
  1103.  
  1104.     DEC    DI        ;回数ポインタを減らす
  1105.     CMP    DI,00
  1106.     JNE    CUPLOOP1    ;無くなるまで繰り返す
  1107. CUPRET:
  1108.     MOV    BP,CX
  1109.     DEC    BP
  1110.     SHL    BP,1            ;行からポインタになおす
  1111.     MOV    BX,[WORD ELINE+BP]    ;BXに現在行頭のポインタを入れる
  1112.     MOV    [WORD CURL],CX        ;行をしまう
  1113.  
  1114.     PUSH    CX            ;何が入っていたか忘れたけど保存する
  1115.  
  1116.     XOR    DH,DH            ;DXを、目標桁とする
  1117.                     ;(DLをDXとして使う)
  1118.     MOV    CX,OFFSET EBUF
  1119.     ADD    CX,[WORD LEN]
  1120.     MOV    [WORD EBLEN],CX        ;仮のEOFポインタ
  1121.  
  1122.     XOR    CX,CX            ;CXを、現在桁とする
  1123.  
  1124. CUPRET2:
  1125.  
  1126. CUPRET2B:
  1127.     MOV    AX,BX            ;CXの過去をAXとする
  1128.  
  1129.     CMP    BX,[WORD EBLEN]
  1130.     JE    CUPRET3            ;EOFなら
  1131.  
  1132.     CMP    [BYTE BX],0DH
  1133.     JNE    CUPRET2C
  1134.     CMP    [BYTE BX+1],0AH
  1135.     JE    CUPRET3            ;リターンチェック
  1136.  
  1137. CUPRET2C:
  1138.     CMP    [BYTE BX],09H
  1139.     JNE    CUPRET2E        ;タブで無いなら飛ばす
  1140.  
  1141.     SHR    CL,1
  1142.     SHR    CL,1
  1143.     SHR    CL,1
  1144.     INC    CL
  1145.     SHL    CL,1
  1146.     SHL    CL,1
  1147.     SHL    CL,1
  1148.  
  1149.     CMP    CL,80
  1150.     JNB    CUPRET3
  1151.  
  1152. CUPRET2D:
  1153.     INC    BX            ;ポインタ移動
  1154.     JMP    SAITEUP
  1155.  
  1156. CUPRET2E:
  1157.     CMP    [BYTE BX],0DFH
  1158.     JA    ZENUP
  1159.     CMP    [BYTE BX],80H
  1160.     JB    EOZUP
  1161.     CMP    [BYTE BX],09FH
  1162.     JA    EOZUP            ;前が半角なら、次が全角先頭か判断
  1163. ZENUP:
  1164.     INC    BX
  1165.     INC    CL
  1166. EOZUP:
  1167.     INC    BX
  1168.     INC    CL            ;ポインタと桁を両方移動させる
  1169. SAITEUP:
  1170.     CMP    DX,CX
  1171.     JA    CUPRET2            ;越えていたら処理終了。越える前の値は、
  1172.                     ;AXに入っているので楽勝。
  1173. CUPRET3:
  1174.     MOV    [WORD CURP],AX        ;上を見ること
  1175.     POP    CX            ;復元
  1176.     RET
  1177.  
  1178. ENDP
  1179.  
  1180. ;---------------------------------------
  1181. ;        カーソルを下に移動
  1182. ;IN    CURX,CURY,DI
  1183. ;OUT    CURX,CURY,表示,CURP,SI
  1184. ;BREAK    BX,CX,DX
  1185. ;---------------------------------------
  1186.  
  1187. PROC    CURDOWN
  1188.  
  1189.     MOV    CX,[WORD CURL]
  1190.     MOV    [BYTE PF],0
  1191.  
  1192.     MOV    DL,[BYTE CURX]
  1193.     MOV    DH,[BYTE CURY]
  1194.     MOV    SI,OFFSET EBUF
  1195. CDNLOOP1:
  1196.     CMP    CX,[WORD LLINE]
  1197.     JE    CDNRET        ;移動不能
  1198.  
  1199.     CMP    DH,22
  1200.     JNE    CDNLOOP2
  1201.  
  1202.     CALL    DOWN
  1203.     INC    [BYTE PF]    ;動いた
  1204.     INC    CX
  1205.  
  1206.     DEC    DI
  1207.     CMP    DI,00
  1208.     JNE    CDNLOOP1
  1209.  
  1210.     JMP    CDNRET
  1211.  
  1212. CDNLOOP2:
  1213.     INC    DH        ;カーソル下
  1214.     INC    CX
  1215.  
  1216.     DEC    DI
  1217.     CMP    DI,00
  1218.     JNE    CDNLOOP1
  1219. CDNRET:
  1220.     JMP    CUPRET        ;カーソル上移動のルーチンを借りている
  1221.  
  1222.     RET
  1223.  
  1224. ENDP
  1225.  
  1226. ;---------------------------------------
  1227. ;        表示画面上移動
  1228. ;IN    NOWL
  1229. ;OUT    NOWL
  1230. ;BREAK    BP,BX
  1231. ;---------------------------------------
  1232.  
  1233. PROC    UP
  1234.  
  1235.     MOV    BP,CX
  1236. ;    MOV    BL,DH        ;DHは常に4
  1237. ;    XOR    BH,BH
  1238. ;    DEC    BL
  1239. ;    DEC    BL
  1240. ;    DEC    BL
  1241.     SUB    BP,1        ;BX → 1  汎用ルーチンとして残しておく。
  1242.     DEC    BP
  1243.     DEC    BP
  1244.     SHL    BP,1
  1245.  
  1246.     MOV    BX,[WORD ELINE+BP]
  1247.     MOV    [WORD NOWL],BX
  1248.  
  1249. UPRET:
  1250.     RET
  1251.  
  1252. ENDP
  1253.  
  1254. ;---------------------------------------
  1255. ;        表示画面下移動
  1256. ;IN    NOWL
  1257. ;OUT    NOWL
  1258. ;BREAK    BP,BX
  1259. ;---------------------------------------
  1260.  
  1261. PROC    DOWN
  1262.  
  1263.     MOV    BP,CX
  1264. ;    MOV    BL,DH        ;DHは常に22
  1265. ;    XOR    BH,BH
  1266. ;    DEC    BL
  1267. ;    DEC    BL
  1268. ;    DEC    BL
  1269.     SUB    BP,19        ;BX → 19  汎用ルーチンとして残しておく
  1270.     SHL    BP,1
  1271.  
  1272.     MOV    BX,[WORD ELINE+BP]
  1273.     MOV    [WORD NOWL],BX
  1274.  
  1275. DOWNRET:
  1276.     RET
  1277.  
  1278. ENDP
  1279.  
  1280. ;---------------------------------------
  1281. ;        現在のステータスを書く
  1282. ;IN    CURP,LEN,LLINE,CX
  1283. ;OUT    表示
  1284. ;BREAK    AH,DX,DI
  1285. ;---------------------------------------
  1286.  
  1287. PROC    NS_PUT
  1288.  
  1289.     MOV    AH,11H
  1290.     MOV    DI,OFFSET SYSATTLIB+4
  1291.     INT    91H            ;リバース
  1292.  
  1293.     MOV    AH,0DH
  1294.     MOV    DH,02
  1295.     MOV    DL,69
  1296.     INT    91H            ;カーソル移動
  1297.  
  1298.     CALL    PUT16BIT        ;現在行を書く
  1299.  
  1300.     MOV    AH,0DH
  1301.     MOV    DH,01
  1302.     MOV    DL,69
  1303.     INT    91H            ;カーソル移動
  1304.  
  1305.     MOV    CX,[WORD CURP]
  1306.     SUB    CX,OFFSET EBUF
  1307.     CALL    PUT16BIT        ;サイズを書く
  1308.  
  1309.     MOV    AH,0DH
  1310.     MOV    DH,01
  1311.     MOV    DL,75
  1312.     INT    91H            ;カーソル移動
  1313.  
  1314.     MOV    CX,[WORD LEN]
  1315.     CALL    PUT16BIT        ;サイズを書く
  1316.  
  1317.     MOV    AH,0DH
  1318.     MOV    DH,02
  1319.     MOV    DL,75
  1320.     INT    91H            ;カーソル移動
  1321.  
  1322.     MOV    CX,[WORD LLINE]
  1323.     CALL    PUT16BIT        ;最終行を書く
  1324.  
  1325.     MOV    AH,11H
  1326.     MOV    DI,OFFSET SYSATTLIB+0
  1327.     INT    91H            ;リバース解除
  1328.  
  1329.     RET
  1330.  
  1331. ENDP
  1332.  
  1333. ;---------------------------------------
  1334. ;    ファイルネームを書く
  1335. ;
  1336. ;
  1337. ;---------------------------------------
  1338.  
  1339. PROC    W_FNAME
  1340.  
  1341. WF_LOOP:
  1342.     MOV    SI,OFFSET FNAME
  1343.     MOV    DI,SI
  1344.     DEC    DI
  1345. WF_LOOP1:
  1346.     CMP    [BYTE SI],"\"
  1347.     JE    WF_LOOP3
  1348.     CMP    [BYTE SI],NULL
  1349.     JE    WF_LOOP4
  1350.  
  1351. WF_LOOP2:
  1352.     INC    SI
  1353.     JMP    WF_LOOP1
  1354.  
  1355. WF_LOOP3:
  1356.     MOV    DI,SI
  1357.     JMP    WF_LOOP2
  1358.  
  1359. WF_LOOP4:
  1360.     INC    DI
  1361.     SUB    SI,DI
  1362.     MOV    CX,SI
  1363.     PUSH    DI
  1364.     PUSH    CX
  1365.  
  1366. FN_PUT:
  1367.     MOV    AH,11H
  1368.     MOV    DI,OFFSET SYSATTLIB+4
  1369.     INT    91H            ;リバース
  1370.  
  1371.     MOV    AH,0DH
  1372.     MOV    DH,01
  1373.     MOV    DL,01
  1374.     INT    91H            ;カーソル移動
  1375.  
  1376.     MOV    AH,1EH
  1377.     MOV    CX,160
  1378.     MOV    DI,OFFSET UPPART
  1379.     INT    91H            ;上の文字を書く
  1380.  
  1381.     CALL    NS_PUT
  1382.  
  1383.     MOV    AH,0DH
  1384.     MOV    DH,02
  1385.     MOV    DL,17
  1386.     INT    91H            ;カーソル移動
  1387.  
  1388.     MOV    AH,11H
  1389.     MOV    DI,OFFSET SYSATTLIB+4
  1390.     INT    91H            ;リバース
  1391.  
  1392.     MOV    AH,1EH
  1393.     POP    CX
  1394.     POP    DI
  1395.     INT    91H            ;出力
  1396.  
  1397.     MOV    AH,11H
  1398.     MOV    DI,OFFSET SYSATTLIB+0
  1399.     INT    91H            ;リバース解除
  1400.  
  1401.     RET
  1402.  
  1403. ENDP
  1404.  
  1405. ;---------------------------------------
  1406. ;        現在行の割り出し(と同時に行ポインタバッファに入れる)
  1407. ;IN    〔EBUF〕
  1408. ;OUT    CX,BP(ポインタ)
  1409. ;BREAK    SI,DL
  1410. ;---------------------------------------
  1411.  
  1412. PROC    NOWLINE
  1413.  
  1414.     XOR    DH,DH        ;全角先頭フラグ
  1415.     MOV    BX,[WORD CURP]
  1416.     MOV    SI,OFFSET EBUF    ;総ポインタ
  1417.     XOR    DL,DL        ;桁ポインタ
  1418.     MOV    BP,02        ;行カウンタ
  1419.     PUSH    DI
  1420.     MOV    DI,[WORD LEN]
  1421.     ADD    DI,OFFSET EBUF
  1422.  
  1423.     JMP    NOLLOOP1
  1424. NOLCOME:
  1425.     INC    SI
  1426.     INC    DL
  1427.  
  1428. NOLLOOP1:
  1429.     MOV    AL,[BYTE SI]
  1430.  
  1431.     CMP    DH,1
  1432.     JE    HANK        ;前の文字が全角先頭なら次は全角後尾
  1433.     CMP    AL,0DFH
  1434.     JA    ZENK
  1435.     CMP    AL,80H
  1436.     JB    EOZK
  1437.     CMP    AL,09FH
  1438.     JA    EOZK        ;前が半角なら、次が全角先頭か判断
  1439. ZENK:
  1440.     MOV    DH,1
  1441.     JMP    EOZK        ;全角先頭と判断
  1442. HANK:
  1443.     XOR    DH,DH        ;全角先頭のフラグを下げる
  1444. EOZK:
  1445.     CMP    SI,BX
  1446.     JNE    NOSAVE
  1447.  
  1448.     MOV    CX,BP
  1449. NOSAVE:
  1450.     CMP    SI,DI
  1451.     JE    NOLRET
  1452.  
  1453.     CMP    DL,80
  1454.     JE    NOLLOOP2
  1455.  
  1456.     CMP    DL,79
  1457.     JNE    NOSAVE2
  1458.     CMP    DH,1
  1459.     JNE    NOSAVE2
  1460.     JMP    NOLLOOP2
  1461. NOSAVE2:
  1462.     CMP    [BYTE SI],09H
  1463.     JNE    NOLLOOP1C
  1464.  
  1465.     INC    SI
  1466.     MOV    AL,DL
  1467.     SHR    AL,1
  1468.     SHR    AL,1
  1469.     SHR    AL,1
  1470.     INC    AL
  1471.     SHL    AL,1
  1472.     SHL    AL,1
  1473.     SHL    AL,1
  1474.  
  1475. NOLLOOP1B:
  1476.     INC    DL
  1477.  
  1478.     CMP    AL,DL
  1479.     JNE    NOLLOOP1B
  1480.  
  1481.     JMP    NOLLOOP1
  1482.  
  1483. NOLLOOP1C:
  1484.     CMP    [BYTE SI],0DH
  1485.     JNE    NOLCOME
  1486.     DEC    BX
  1487.     CMP    BX,SI
  1488.     INC    BX
  1489.     JE    NOLCOME
  1490.     CMP    [BYTE SI+1],0AH
  1491.     JNE    NOLCOME
  1492.  
  1493.     INC    SI
  1494.     INC    SI
  1495. NOLLOOP2:
  1496.     MOV    [WORD ELINE+BP],SI
  1497.     INC    BP
  1498.     INC    BP
  1499.     XOR    DL,DL
  1500.     JMP    NOLLOOP1
  1501.  
  1502. NOLRET:
  1503.     MOV    AX,BP
  1504.     SHR    AX,1
  1505.     MOV    [WORD LLINE],AX
  1506.  
  1507.     MOV    BP,CX
  1508.     SHR    CX,1
  1509.     MOV    [WORD CURL],CX
  1510.  
  1511.     POP    DI
  1512.  
  1513.     RET
  1514.  
  1515. ENDP
  1516.  
  1517. ;////////////////////
  1518. ;    16ビット自然数の書き出し
  1519. ;
  1520. ;        CXを書く
  1521. ;
  1522. ;    AX、BX、CX、DXが壊れる
  1523. ;////////////////////
  1524. PROC    PUT16BIT
  1525.  
  1526.     MOV    AX,CX
  1527.     XOR    DX,DX
  1528.     MOV    BX,10000
  1529.     DIV    BX
  1530.     MOV    BL,AL
  1531.     ADD    AL,30H
  1532.     MOV    [BYTE GET16BUF+0],AL
  1533.     MOV    AL,BL
  1534.     MOV    BX,10000
  1535.     MUL    BX
  1536.     SUB    CX,AX
  1537.  
  1538.     MOV    AX,CX
  1539.     MOV    BX,1000
  1540.     DIV    BX
  1541.     MOV    BL,AL
  1542.     ADD    AL,30H
  1543.     MOV    [BYTE GET16BUF+1],AL
  1544.     MOV    AL,BL
  1545.     MOV    BX,1000
  1546.     MUL    BX
  1547.     SUB    CX,AX
  1548.  
  1549.     MOV    AX,CX
  1550.     MOV    BX,100
  1551.     DIV    BX
  1552.     MOV    BL,AL
  1553.     ADD    AL,30H
  1554.     MOV    [BYTE GET16BUF+2],AL
  1555.     MOV    AL,BL
  1556.     MOV    BX,100
  1557.     MUL    BX
  1558.     SUB    CX,AX
  1559.  
  1560.     MOV    AX,CX
  1561.     MOV    BX,10
  1562.     DIV    BX
  1563.     MOV    BL,AL
  1564.     ADD    AL,30H
  1565.     MOV    [BYTE GET16BUF+3],AL
  1566.     MOV    AL,BL
  1567.     MOV    BX,10
  1568.     MUL    BX
  1569.     SUB    CX,AX
  1570.  
  1571.     MOV    AX,CX
  1572.     ADD    AL,30H
  1573.     MOV    [BYTE GET16BUF+4],AL
  1574.  
  1575.     MOV    AH,1EH
  1576.     MOV    CX,5
  1577.     MOV    DI,OFFSET GET16BUF
  1578.     INT    91H
  1579.  
  1580.     RET
  1581.  
  1582. ENDP
  1583.  
  1584. ;////////////////////
  1585. ;    俗に言う『strcpy』
  1586. ;
  1587. ;     SIとDIに入れる。
  1588. ;
  1589. ;    ALが壊れ、BPにはコピーした数が返る
  1590. ;////////////////////
  1591. PROC    STRCPY
  1592.  
  1593.     XOR    BP,BP
  1594. STRCPY2:
  1595.     MOV    AL,[BYTE DS:SI+BP]
  1596.     MOV    [BYTE ES:DI+BP],AL
  1597.     CMP    AL,00H
  1598.     JE    STRCPY3
  1599.     INC    BP
  1600.     JMP    STRCPY2
  1601. STRCPY3:
  1602.     RET
  1603.  
  1604. ENDP
  1605.  
  1606. ;---------------------------------------
  1607. ;        初期化データ部
  1608. ;---------------------------------------
  1609.  
  1610. SYSLINE:
  1611.     DW    SYSCHAR
  1612.     DW    ?
  1613.     DW    SYSATTLIB
  1614.     DW    ?
  1615.  
  1616. SYSCHAR:
  1617.     DB    "  ",4AH,5DH,42H,38H," "    ;保存
  1618.     DB    "  ",46H,49H,39H,7EH," "    ;読込
  1619.     DB    "  ",32H,7EH,4CH,3EH," "    ;改名
  1620.     DB    " ",3AH,46H,4AH,54H,3DH,38H    ;再編集
  1621.     DB    "  ",39H,39H,3FH,37H," "    ;更新
  1622.     DB    "       "
  1623.     DB    "       "
  1624.     DB    "       "
  1625.     DB    "       "
  1626.     DB    "  ",3DH,2AH,4EH,3BH," "    ;終了
  1627.  
  1628. SYSATTLIB:
  1629.     DB    00H,00000000B,7,0
  1630.     DB    00H,00001000B,7,0
  1631.     DB    01H,00001000B,7,0
  1632.     DB    03H,00001000B,7,0
  1633.     DB    01H,00001000B,7,0
  1634.     DB    03H,00001000B,7,0
  1635.     DB    00H,00001000B,7,0    ;保存
  1636.  
  1637.     DB    00H,00000000B,7,0
  1638.     DB    00H,00001000B,7,0
  1639.     DB    01H,00001000B,7,0
  1640.     DB    03H,00001000B,7,0
  1641.     DB    01H,00001000B,7,0
  1642.     DB    03H,00001000B,7,0
  1643.     DB    00H,00001000B,7,0    ;読込
  1644.  
  1645.     DB    00H,00000000B,7,0
  1646.     DB    00H,00001000B,7,0
  1647.     DB    01H,00001000B,7,0
  1648.     DB    03H,00001000B,7,0
  1649.     DB    01H,00001000B,7,0
  1650.     DB    03H,00001000B,7,0
  1651.     DB    00H,00001000B,7,0    ;改名
  1652.  
  1653.     DB    00H,00000000B,7,0
  1654.     DB    01H,00001000B,7,0
  1655.     DB    03H,00001000B,7,0
  1656.     DB    01H,00001000B,7,0
  1657.     DB    03H,00001000B,7,0
  1658.     DB    01H,00001000B,7,0
  1659.     DB    03H,00001000B,7,0    ;再編集
  1660.  
  1661.     DB    00H,00000000B,7,0
  1662.     DB    00H,00001000B,7,0
  1663.     DB    01H,00001000B,7,0
  1664.     DB    03H,00001000B,7,0
  1665.     DB    01H,00001000B,7,0
  1666.     DB    03H,00001000B,7,0
  1667.     DB    00H,00001000B,7,0    ;更新
  1668.  
  1669.     DB    00H,00000000B,7,0
  1670.     DB    00H,00001000B,7,0
  1671.     DB    00H,00001000B,7,0
  1672.     DB    00H,00001000B,7,0
  1673.     DB    00H,00001000B,7,0
  1674.     DB    00H,00001000B,7,0
  1675.     DB    00H,00001000B,7,0
  1676.  
  1677.     DB    00H,00000000B,7,0
  1678.     DB    00H,00001000B,7,0
  1679.     DB    00H,00001000B,7,0
  1680.     DB    00H,00001000B,7,0
  1681.     DB    00H,00001000B,7,0
  1682.     DB    00H,00001000B,7,0
  1683.     DB    00H,00001000B,7,0
  1684.  
  1685.     DB    00H,00000000B,7,0
  1686.     DB    00H,00001000B,7,0
  1687.     DB    00H,00001000B,7,0
  1688.     DB    00H,00001000B,7,0
  1689.     DB    00H,00001000B,7,0
  1690.     DB    00H,00001000B,7,0
  1691.     DB    00H,00001000B,7,0
  1692.  
  1693.     DB    00H,00000000B,7,0
  1694.     DB    00H,00001000B,7,0
  1695.     DB    00H,00001000B,7,0
  1696.     DB    00H,00001000B,7,0
  1697.     DB    00H,00001000B,7,0
  1698.     DB    00H,00001000B,7,0
  1699.     DB    00H,00001000B,7,0
  1700.  
  1701.     DB    00H,00000000B,7,0
  1702.     DB    00H,00001000B,7,0
  1703.     DB    01H,00001000B,7,0
  1704.     DB    03H,00001000B,7,0
  1705.     DB    01H,00001000B,7,0
  1706.     DB    03H,00001000B,7,0
  1707.     DB    00H,00001000B,7,0    ;終了
  1708.  
  1709. UPPART:
  1710.     DB    "                             TH editor  v0.53         "
  1711.     DB    "         SIZE[00000/00000]"
  1712.  
  1713.     DB    " Edit Filename >                                      "
  1714.     DB    "         LINE[00000/00000]"
  1715.  
  1716. SPA80:
  1717.     DB    80 DUP(20H)
  1718.  
  1719. TMP_NAME:
  1720.     DB    80
  1721.     DB    ?
  1722.     DB    80 DUP(?)    ;名前入力用
  1723.  
  1724. ;---------------------------------------
  1725. ;        未初期化データ
  1726. ;---------------------------------------
  1727.  
  1728. ELINE:
  1729.     DW    EBUF            ;先頭
  1730.     DW    1000H DUP(?)        ;テキスト行ポインタ
  1731. FNAME:
  1732.     DB    128 DUP(?)        ;ファイルネーム
  1733. CMDPOINTER:
  1734.     DW    80H DUP(?)        ;コマンドライン・バッファ
  1735. CURX:
  1736.     DB    ?            ;カーソル桁
  1737. CURY:
  1738.     DB    ?            ;カーソル行
  1739. PF:
  1740.     DB    ?            ;改変のフラグ(0=無変更)
  1741. LEN:
  1742.     DW    ?            ;テキストの長さ
  1743. CMDCOUNTER:
  1744.     DW    ?            ;コマンドライン・ポインタ
  1745. LLINE:
  1746.     DW    ?            ;テキストの最終行
  1747. EBLEN:
  1748.     DW    ?            ;EBUF+LEN(TMP)
  1749. CURP:
  1750.     DW    ?            ;カーソルポインタ
  1751. CURL:
  1752.     DW    ?            ;カーソル行
  1753. NOWL:
  1754.     DW    ?            ;表示行の先頭ポインタ
  1755. CHAN:
  1756.     DW    ?            ;文字一括数
  1757. ZHF:
  1758.     DW    ?            ;全角半角フラグ(カーソル兼)
  1759. GET16BUF:
  1760.     DB    5 DUP(?)        ;GET16BITバッファ
  1761. SCRBUF:
  1762.     DB    80*21+2 DUP(?)        ;仮テキストVRAM
  1763. EBUF:
  1764.     DB    FULL DUP(?)        ;テキストバッファ
  1765.  
  1766. ENDS        CODE
  1767.  
  1768. END    ENTRY
  1769.